/**
 * --------------------------------------------------
 * Hoja de Trabajo 1: Implementación de una Radio 
 * --------------------------------------------------
 * - Universidad del Valle de Guatemala
 * - Algoritmos y Estructuras de Datos
 * - Manuel Contreras - 11043
 * - Miguel Zea - 09238
 * - Eduardo Drummond - 09265
 */ 


package carro;

/** 
 * Clase que implementa los métodos de la interfaz 'Radio', para crear una radio capaz de sintonizar cualquier estación,
 * ya sea FM o AM, y guardar las estaciones preferidas en 12 botones.
 */
public class RadioM implements Radio {
    private boolean banda;                          // Variable privada que sirve para determinar la frecuencia de sintonización de la radio con los estados FM=true y AM=false
    private float estacion ;                        // Variable que almacena la estación actual de la radio
    private static boolean on_off;                  // Variable que determina si la radio esta encendida o apagada
    float[] listaFm = new float[12];                // Vector de variables para el que cada espacio corresponde a un botón
    float[] listaAm = new float[12];                // Vector de variables para el que cada espacio corresponde a un botón
    
/**
 * Método responsable de cambiar el valor del atributo on_off, para encender o apagar la radio.
 */
    @Override
    public void onOff() {                           
       for(int index = 0; index < 12; index++) {    // Inicialización de los vectores para que tengan un valor default determinado 
           listaFm[index] = FM_MIN;                 // Todos los valores del vector listaFm se inicializan con FM_MIN
           listaAm[index] = AM_MIN;                 // Todos los valores del vector listaAm se inicializan con AM_MIN
       }
       
       if(on_off == false) {                        // Condición que cambia el valor booleano de on_off por el opuesto al valor actual
           on_off = true;        
       } else if(on_off == true) {
           on_off = false;
           this.banda = false;
       }
       
    }

/**
 * Método responsable del cambio de banda a sintonizar.
 */
    @Override
    public void cambiarBanda() {
        if(on_off == true) {                        // Condición que permite la ejecución de código si la radio esta encendida (on_off == true, de lo contrario el método no realiza acción alguna
            if (this.banda == true) {               // Condición que determina en que banda está, si es FM se cambia el valor de banda de true a false (cambio de FM a AM)
                this.banda = false;
                this.estacion = AM_MIN;             // El valor de estación se cambia por el valor mínimo de las frecuencias seleccionables en AM
            } else if (this.banda == false) {       // Condición que determina en que banda está, si es AM se cambia el valor de banda de false a true (cambio de AM a FM)
                this.banda = true;
                this.estacion = FM_MIN;             // El valor de estación se cambia por el valor mínimo de las frecuencias seleccionables en FM
            }
        }
    }
    
/**
 * Método empleado para el incremento de frecuencia en ambas bandas de sintonización,
 * el cual depende de los valores delta para tanto AM como FM.
 */
    @Override
    public void cambiarFrecuencia() {
        if(on_off == true){                         // Condición que permite la ejecución de código si la radio esta encendida (on_off == true, de lo contrario el método no realiza acción alguna
            if(banda == true){                      // Si banda esta en FM se ejecuta lo siguietne
                if(this.estacion < FM_MAX){         // Condición que sirve para que la radio no se salga del rango de estaciones seleccionables
                    this.estacion = (float) (this.estacion + 0.2);// Aumento de la frecuencia correspondiente a la banda FM
                } else {                            // De lo contrario si ya alcanzó la frecuencia máxima sintonizable se regresa a la primera
                    this.estacion = FM_MIN;
                }
            } else {                                // De lo contrario la banda está en AM
                if(this.estacion < AM_MAX){
                    this.estacion = this.estacion + 10;// Aumento de la frecuencia correspondiente a la banda AM
                } else {                            // De lo contrario si ya alcanzó la frecuencia máxima sintonizable se regresa a la primera
                    this.estacion = AM_MIN;
                }
            }
        }
    }

/**
 * Método que retorna la estación actual sintonizada.
 */
    @Override
    public float getFrecuencia() {
        if(on_off == true){                         // Condición que permite la ejecución de código si la radio está encendida (on_off == true, de lo contrario el método no realiza acción alguna
        return this.estacion;
        } else {
        return (float) 0.0;                         // En caso de estar apagada la radio, en pantalla se mostrará una frecuencia de 0.0 por default
        }
    }

/**
 * Método que informa si la radio se encuentra encendida o no.
 */
    @Override
    public boolean isOn() {
        return on_off;
    }

/**
 * Método responsable de sintonizar una estación previamente guardada en alguno de los 12
 * botones, para ambas FM y AM
 */
    @Override
    public void seleccionarEstacion(int boton) {
        if(on_off == true) {                       // Condición que permite la ejecución de código si la radio esta encendida (on_off == true, de lo contrario el método no realiza acción alguna
            if(this.banda == true) {               // Condición que determina si banda esta en FM 
                this.estacion = this.listaFm[boton-1];// Vector que almacena la estación actual en un espacio de memorria correspondiente al valor del parámetro botón
            } else {                               // Si es AM
                this.estacion = this.listaAm[boton-1];// Vector que almacena la estacion actual en un espacio de memorria correspondiente al valor del parámetro botón
            }
        }
    }

/**
 * Método encargado de almacenar una estación deseada en el botón especificado, para su
 * acceso futuro.
 */
    @Override
    public void guardarEstacion(int boton) {
        if(on_off == true) {                        // Condición que permite la ejecución de codigo si la radio está encendida (on_off == true, de lo contrario el método no realiza acción alguna
            if(this.banda == true) {                // Condición que determina que vector utilizar según el valor de banda
                this.listaFm[boton-1] = this.estacion;// Vector en donde se encuentran las emisoras almacenadas correspondientes a FM
            } else {
                this.listaAm[boton-1] = this.estacion;// Vector en donde se encuentran las emisoras almacenadas correspondientes a AM
            }
        }
    }

/**
 * Método que informa si el radio se encuentra en modo AM.
 */
    @Override
    public boolean isAM() {
        if (this.banda == true) {                   // Condición que elabora un not al valor de banda para regresar el valor corespondiente a AM según lo especificado en la interface
            return false;
        } else {
            return true;
        }
    }

/**
 * Método que informa si el radio se encuentra en modo FM.
 */
    @Override
    public boolean isFM() {
        return this.banda;
    }

    
}
